// 配置层 管理程序配置信息
package config

import (
	"krm-backend/utils/logs"
	"path"
	"runtime"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"k8s.io/client-go/kubernetes"
)

const (
	TimeFormat                    string = "2006-01-02 15:04:05"
	ClusterConfigSecretLabelKey   string = "g8s.me/cluster.metadata"
	ClusterConfigSecretLabelValue string = "true"
)

var (
	Port       string //端口号 外部调用
	JwtSignKey string //jwt secret外部调用
	JwtExpTime int64  //jwt token过期时间 单位分钟
	UserName   string
	Password   string
	// inCluster相关配置
	MetadataNamespace  string                //元数据存储的namespace
	InClusterClientSet *kubernetes.Clientset //保存clientset类型到InClusterClientSet
	ClusterkubeConfig  map[string]string     //保存kubeconfig文件
)

type ReturnData struct {
	Status  int                    `json:"status"`
	Message string                 `json:"message"`
	Data    map[string]interface{} `json:"data"`
}

// 默认值构造函数
func NewReturnData() ReturnData {
	ReturnData := ReturnData{}
	ReturnData.Status = 200 //设置status默认为200
	data := make(map[string]interface{})
	ReturnData.Data = data
	return ReturnData
}

func initLogConfig(logLevel string) { //配置程序输出级别
	if logLevel == "debug" {
		logrus.SetLevel(logrus.DebugLevel)
	} else {
		logrus.SetLevel(logrus.InfoLevel)
	}
	logrus.SetReportCaller(true) //文件名行号
	logrus.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: TimeFormat,
		//runtime.Frame:帧 可用于获取调用者返回的PC值函数，文件或者是行信息
		//程序日志文件名处理
		CallerPrettyfier: func(f *runtime.Frame) (function string, file string) {
			fileName := path.Base(f.File)
			return f.Function, fileName
		},
	})
}

func init() {
	viper.SetDefault("LOG_LEVEL", "debug")     //设置环境变量加载程序日志级别 默认:debug
	viper.SetDefault("PORT", ":8080")          //设置环境变量加载程序端口号 默认:8080
	viper.SetDefault("JWT_SIGN_KEY", "chuang") //设置获取jwt加密的secret 默认:chuang
	viper.SetDefault("JWT_EXP_TIME", 120)      //设置JWT过期时间 默认:2小时

	viper.SetDefault("USERNAME", "dawn")          //设置环境变量中的登录用户名 默认:chuang
	viper.SetDefault("PASSWORD", "123456")        //设置环境变量中的登录密码 默认:123456
	viper.SetDefault("METADATA_NAMESPACE", "krm") //设置原始数据存储在哪个名称空间 环境变量
	viper.AutomaticEnv()
	logLevel := viper.GetString("LOG_LEVEL") //获取系统环境变量定义的日志等级
	initLogConfig(logLevel)
	logs.Debug(nil, "开始加载程序配置")

	Port = viper.GetString("PORT")               //获取系统环境变量端口号传给r.run()
	JwtSignKey = viper.GetString("JWT_SIGN_KEY") //获取系统环境变量JWT的密钥
	JwtExpTime = viper.GetInt64("JWT_EXP_TIME")  //获取系统环境变量JWT的过期时间
	UserName = viper.GetString("USERNAME")       //获取系统环境变量账号
	Password = viper.GetString("PASSWORD")       //获取系统环境变量密码
	MetadataNamespace = viper.GetString("METADATA_NAMESPACE")
	logs.Debug(map[string]interface{}{"用户名": UserName, "密码": Password}, "获取到程序用户名密码配置")
}
